package controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Date;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.MultipartStream;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import AccessDB.AvaliacaoDAO;
import AccessDB.BimestreDAO;
import AccessDB.DisciplinaProfessorDAO;
import AccessDB.MaterialEstudoDAO;
import AccessDB.MensagemDAO;

import model.Avaliacao;
import model.AvaliacaoNota;
import model.Bimestre;
import model.DisciplinaProfessor;
import model.Mensagem;
import model.Professor;

public class ComandoProfessorServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
    public ComandoProfessorServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// novo - 11/12/2009 - por Luiz Felipe (
		
		String comando = request.getParameter("comando");
		HttpSession session = request.getSession();
		String cpfProf = ((Professor) session.getAttribute("usuario")).getCpf();
		// Novo por Rui
		if(comando.equalsIgnoreCase("editarAvaliacao"))
		{
			int id = Integer.parseInt(request.getParameter("id"));
			Avaliacao av;
			try {
				av = new AvaliacaoDAO().retornaAvaliacao(id);
				List<AvaliacaoNota> avNota = new AvaliacaoDAO().retornaAvaliacaoNota(id);
				
				request.setAttribute("notas", avNota);
				request.setAttribute("avaliacao", av);
				
				int ano = (Integer)((DisciplinaProfessor) session.getAttribute("discProf")).getAno();
				List<Bimestre> bimestres = new BimestreDAO().retornaBimestresDoAno(ano);
				request.setAttribute("bimestres", bimestres);
				
				RequestDispatcher dispatcher = request.getRequestDispatcher("professor/editar_avaliacao.jsp");
				dispatcher.forward(request, response);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return;
		}
		else if(comando.equalsIgnoreCase("removerAvaliacao")){
			int id = Integer.parseInt(request.getParameter("id"));
			
			try {
				new AvaliacaoDAO().removerAvaliacao(id);
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher("professor/index.jsp");
			dispatcher.forward(request, response);
			
			return;
		}

		
		
		else if(comando.equalsIgnoreCase("enviarMensagem")){
			
			String assunto = request.getParameter("msgAssunto");  
			String msgText = request.getParameter("msgText");
			String data = Sistema.instance.retornaDataSql(request.getParameter("dataMsg").split(" "));
			String check = "EnviarParaTurma";
			
			int idTurma = ((DisciplinaProfessor)session.getAttribute("discProf")).getIdTurma();
			int idDisciProf = ((DisciplinaProfessor)session.getAttribute("discProf")).getIdDisciplinaProf();			
		
			Mensagem msg = new Mensagem();
			msg.setIdDisciplinaProf(idDisciProf);
			msg.setConteudo(msgText);
			msg.setTiulo(assunto);
			msg.setDataHora(data);
			
			
			try {
				new MensagemDAO().inserirMensagem(msg);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	
			if(check!=null){
				try {
										
					new MensagemDAO().inserirMensagemParaTodos(msg.getIdMsg(), idTurma);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		
			RequestDispatcher dispatcher = request.getRequestDispatcher("professor/index.jsp");
    		dispatcher.forward(request, response);
			
		}
		else if(comando.equalsIgnoreCase("removerMaterial"))
		{
			int idMaterial = Integer.parseInt(request.getParameter("id"));
			
			try {
				new MaterialEstudoDAO().removerMaterial(idMaterial);
				
				RequestDispatcher dispatcher = request.getRequestDispatcher("professor/index.jsp");
	    		dispatcher.forward(request, response);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return;
		}

				
		// ) novo - 11/12/2009 - por Luiz Felipe
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession();
		String comando = request.getParameter("comando");
		
		boolean isMultiPart = ServletFileUpload.isMultipartContent(request) || false;
		
		if(isMultiPart)
		{
			ServletFileUpload upload = null;  
		    DiskFileItemFactory factory = new DiskFileItemFactory();  
		    factory.setSizeThreshold(1024*1024*5);  
		    //factory.setRepository(new File("PATH_PARA_SALVAR_ARQUIVOS_GRANDES"));  
		    upload = new ServletFileUpload(factory);  
		    List fileItems;
			try {
				fileItems = upload.parseRequest(request);
				Iterator it = fileItems.iterator();
				FileItem fitem = null;  
			    FileItem farquivo = null;  
			    String assunto = "";
			    String data = "";
			    String nomeArquivo = "";
			    boolean inserido = false;
			    while (it.hasNext())  
			    {  
			       fitem = (FileItem) it.next();
			       if (fitem.isFormField())  
			       {  
			          if(fitem.getFieldName().equals("assuntoMaterial"))  
			          {  
			             assunto = fitem.getString();
			          }
			          else if(fitem.getFieldName().equals("dataAtual")){
			        	  data = Sistema.retornaDataSql(fitem.getString().split(" "));
			          }
			       }  
			       else  
			       {  
			   		//Pegando o arquivo e copiando na pasta
			   		
		   		  File arquivo = new File(getServletContext().getRealPath("/") + "/MaterialDownload/" + fitem.getName());
			   			System.out.println(arquivo.getAbsolutePath());           
		           FileOutputStream output = new FileOutputStream(arquivo);

		           InputStream is = fitem.getInputStream();

		           byte[] buffer = new byte[(int) fitem.getSize()];

		           int nLidos;

		           while ((nLidos = is.read(buffer)) >= 0)
		               output.write(buffer, 0, nLidos);
		           
		           output.flush();
		           output.close();
			    	   inserido = new MaterialEstudoDAO().inserirArquivoPasta("/MaterialDownload/" + fitem.getName(), ((DisciplinaProfessor)session.getAttribute("discProf")).getIdDisciplinaProf(), assunto, data);
			       }
			    }
			    
			    if(inserido){
			    	RequestDispatcher dispatcher = request.getRequestDispatcher("professor/index.jsp");
					dispatcher.forward(request, response);
			    }
			    
			} catch (FileUploadException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		else if(comando.equalsIgnoreCase("cadastrarAvaliacao")){
			String titulo = request.getParameter("tituloAtividade");
			
			int idBimestre = Integer.parseInt(request.getParameter("bimestreAtividade"));
			
			String data = Sistema.dataNormalParaSql(request.getParameter("dataAtividade").split("/"));
			
			int peso = Integer.parseInt(request.getParameter("pesoAtividade"));
			DisciplinaProfessor discProf = (DisciplinaProfessor)session.getAttribute("discProf");
			int ano = discProf.getAno();
			int idDisciplinaProf = discProf.getIdDisciplinaProf();
			
			try {
				Avaliacao nova = new AvaliacaoDAO().cadastrarAvaliacao(idDisciplinaProf, titulo, idBimestre, data, peso);
				List<Avaliacao> av = ((DisciplinaProfessor) session.getAttribute("discProf")).getAvaliacoes();
				av.add(nova);
				new AvaliacaoDAO().popularNotasDosAlunos(idDisciplinaProf);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return;
		}
		else if(comando.equalsIgnoreCase("removerAvaliacao")){
			int id = Integer.parseInt(request.getParameter("id"));
			
			try {
				
				Avaliacao av = new AvaliacaoDAO().removerAvaliacao(id);
				System.out.println(av.getTitulo());
				List<Avaliacao> avs = ((DisciplinaProfessor) session.getAttribute("discProf")).getAvaliacoes();
				Avaliacao avNoAvs = null;
				for(Avaliacao avaliacao : avs)
				{
					if(avaliacao.equals(av))
						avNoAvs = avaliacao;
				}	

				avs.remove(avNoAvs);
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return;
		}
		else if(comando.equalsIgnoreCase("atribuirNotas"))
		{
			int numAv = Integer.parseInt(request.getParameter("numAv"));
			String[] ids = request.getParameterValues("matAlunos");
			String[] notas = request.getParameterValues("notas");
			
			Map<String, Double> mapa = new HashMap<String, Double>();
			
			for(int i = 0; i < ids.length; i++)
			{
				if(notas[i].isEmpty())
					mapa.put(ids[i], 0.00);
				else
					mapa.put(ids[i], Double.parseDouble(notas[i]));
			}
			
			try {
				new AvaliacaoDAO().atribuirNota(numAv, mapa);
				
				PrintWriter out = response.getWriter();
				out.print("ok");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		else if(comando.equalsIgnoreCase("editarDadosAvaliacao"))
		{
			String titulo = request.getParameter("titulo");
			int numAv = Integer.parseInt(request.getParameter("numAv"));
			int numBimestre = Integer.parseInt(request.getParameter("numBimestre"));
			String data = Sistema.dataNormalParaSql(request.getParameter("dataAv").split("/"));
			int peso = Integer.parseInt(request.getParameter("peso"));
			
			System.out.println(numBimestre);
			
			Avaliacao editada = new Avaliacao();
			editada.setData(data);
			editada.setNumAvaliacao(numAv);
			editada.setNumBimestre(numBimestre);
			editada.setPeso(peso);
			editada.setTitulo(titulo);
			
			try {
				new AvaliacaoDAO().editarAvaliacao(editada);
				
				DisciplinaProfessor dp = (DisciplinaProfessor)session.getAttribute("discProf");
				session.setAttribute("discProf", new DisciplinaProfessorDAO().gerarDisciplinaProfessor(dp.getIdDisciplinaProf(), dp.getIdTurma()));
				
				PrintWriter out = response.getWriter();
				out.print("ok");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		else if(comando.equalsIgnoreCase("editarTituloMaterial"))
		{
			int idMaterial = Integer.parseInt(request.getParameter("element_id"));
			String novoTitulo = request.getParameter("update_value");
			
			try {
				new MaterialEstudoDAO().editarTituloMaterial(idMaterial, novoTitulo);
				response.setCharacterEncoding("UTF-8");
				
				PrintWriter out = response.getWriter();

				out.print(novoTitulo);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

	}
}
